package cn.south.campus.admin.campus.service.impl;

import cn.south.campus.admin.campus.mapper.PartTimeJobApplyMapper;
import cn.south.campus.admin.campus.model.entity.PartTimeJob;
import cn.south.campus.admin.campus.model.entity.PartTimeJobApply;
import cn.south.campus.admin.campus.model.enums.CampusRespEnums;
import cn.south.campus.admin.campus.model.enums.PartTimeJobEnums;
import cn.south.campus.admin.campus.model.vo.PartTimeJobApplyVo;
import cn.south.campus.admin.campus.service.PartTimeJobApplyService;
import cn.south.campus.admin.campus.service.PartTimeJobService;
import cn.south.campus.common.exceptions.BusinessException;
import cn.south.campus.common.model.enums.CommonEnums;
import cn.south.campus.common.utils.AssertUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;

/**
 * <p>
 * 校园兼职申请表 服务实现类
 * </p>
 *
 * @author chow
 * @since 2025-03-27
 */
@Service
@AllArgsConstructor
public class PartTimeJobApplyServiceImpl extends ServiceImpl<PartTimeJobApplyMapper, PartTimeJobApply> implements PartTimeJobApplyService {

    private final PartTimeJobApplyMapper partTimeJobApplyMapper;

    private final PartTimeJobService partTimeJobService;

    @Override
    public List<PartTimeJobApplyVo> queryApplyList(Long jobId) {
        List<PartTimeJobApply> partTimeJobApplyList = partTimeJobApplyMapper.queryApplyList(jobId);
        return partTimeJobApplyList.stream().map(PartTimeJobApplyVo::convert).collect(Collectors.toList());
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void audit(Long id, Integer status) {
        PartTimeJobApply partTimeJobApply = partTimeJobApplyMapper.selectById(id);
        AssertUtils.isNotNull(partTimeJobApply, CommonEnums.DATA_HAS_NOT_ERROR);
        Long jobId = partTimeJobApply.getJobId();
        PartTimeJob partTimeJob = partTimeJobService.getById(jobId);
        Long count = partTimeJobApplyMapper.selectCount(new LambdaQueryWrapper<PartTimeJobApply>()
                .eq(PartTimeJobApply::getJobId, jobId).eq(PartTimeJobApply::getStatus, PartTimeJobEnums.ApplyStatus.PASS.getCode()));
        if (status.equals(PartTimeJobEnums.ApplyStatus.PASS.getCode())) {
            // 审核通过，校验是否达到上限
            if (count >= partTimeJob.getCount()) {
                throw new BusinessException(CampusRespEnums.PART_TIME_JOB_APPLY_COUNT_LIMIT_ERROR);
            }
            if (partTimeJob.getCount() == count + 1) {
                // 最后一个，修改状态为已完成
                partTimeJob.setStatus(PartTimeJobEnums.PartTimeJobStatus.FINISHED.getCode());
                partTimeJobService.updateById(partTimeJob);
            }
        } else if (status.equals(PartTimeJobEnums.ApplyStatus.REJECT.getCode())) {
            // 数量-1时修改状态为已发布
            if (Integer.parseInt(String.valueOf(count)) == partTimeJob.getCount()
                    && partTimeJob.getStatus().equals(PartTimeJobEnums.PartTimeJobStatus.FINISHED.getCode())) {
                partTimeJob.setStatus(PartTimeJobEnums.PartTimeJobStatus.PUBLISHED.getCode());
                partTimeJobService.updateById(partTimeJob);
            }
        }
        partTimeJobApply.setStatus(status);
        partTimeJobApplyMapper.updateById(partTimeJobApply);
    }
}
